
#ifndef GRAPH_H
#define GRAPH_H

#include<iostream>
#include"interestNode.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

using namespace std;
static int MaxSize = 10000;



//邻接矩阵实现
template <typename Element>
class AMGraph {
public:
    AMGraph();					//构造函数
    //该构造函数输入0或1实现不同的测试实例
    AMGraph(bool x);			//方便测试的构造函数
    void bfTraverse(int v);		//广度优先遍历（从第v个节点开始）
    void dfTraverse(int v);		//深度优先遍历（从第v个节点开始）  
    void getEdge(int** &edge2);  //获取图里面的矩阵
    Element* getVertex();
    int getVertexNum();         //获取图中的顶点个数
    int getEdgeNum();           //获取图里面边的个数  
    int inZero();               //入度为0的个数
    int outZero();              //出度为0的个数
    void addVertex(Element newData);    //添加点
    void addEdge(int src,int dest,int length);                        //添加边
    void deleteVertex(int index);                //删除点
    void deleteEdge(int src,int dest);                      //删除边
    void printEdge();
    void printVertexPoi();
    void printFloyd();

    void inquire(Element serialNumber);//查询顶点序号（注意所有的点序号是从1开始的），形参是顶点序号（1、2、3或者a,b,c）（不是下标）、
    void Floyd();//弗洛伊德算法


    //以下是数据库函数
   int  databasePreprocessing();//预处理函数，int 为了return

    int insertVertexIntoTable1(const Element& vertex);//插入表1

    int insertEdgeIntoTable2(int rowIndex, int colIndex, int edgeValue);//插入表2



protected:
    void dfTraverse(bool* visited,int v);
private:
    Element* vertex;	//顶点数组，每个元素是struct  interestNode
    int** edge;	//邻接矩阵,每个元素是权重

    int vertexNum;				//顶点数目
    int edgeNum;				//边数目

    int** path; // 用于存储最短路径上的中间节点（记录的是顶点之间的关系）
    int** dist; // 用于存储两点间的最短距离

//    interestNode InNode ;  //标准结点
};






#endif // GRAPH_H


